#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>

using namespace std ;

const int maxn = 110 ;

typedef pair<int , int > PII ;  //二元组用来存坐标

int n , m ;
int g[maxn][maxn];  //g表示这个图
int d[maxn][maxn];  //d数组表示每个点到起点的距离 , 就是一个标记数组 ，初始化所有的为 -1 ， 表示还没有走过


queue<pair<int , int >> q ;

int bfs() {

    memset(d , -1 , sizeof d) ; //将 d 的所有位置置为 -1 ， 表示没走过
    q.push({0 , 0});
    d[0][0] = 0 ; //原点的距离为 0

    int dx[4] = {-1 , 0 , 1 , 0} , dy[4] = {0 , 1 , 0 , -1};

    while(!q.empty()) {
        pair<int , int > t = q.front() ;
        q.pop();
        for(int i = 0 ; i < 4 ; i ++) {
            int newx = t.first + dx[i] ;     //新的x
            int newy = t.second + dy[i] ;    //新的y
            //检验下一个坐标是否合法
            if(newx>=0 && newx < n && newy >= 0 && newy < m) {
                d[newx][newy] = d[t.first][t.second] + 1 ;
                q.push({newx , newy}) ;
            }
        }
    }

    return g[n - 1][m - 1] ;


}

int main() {

    cin >> n >> m ;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> g[i][j];
        }
    }

    cout << bfs() << endl ;

    return 0 ;
}